"""

登录
https://passport.bilibili.com/login?from_spm_id=333.337.top_bar.login_window
需求
通过selenium爬取京东图书关键字的书籍数据
字段需求
1书名
2价格
3门店名字

要求
1获取完每一页的所有书籍数据
2以及需要翻页获取

2203-名字-第六次作业
下节课之前交

京东
https://search.jd.com/Search?keyword=%E5%9B%BE%E4%B9%A6&enc=utf-8&pvid=de63a8e8d06c44d4a477ae5b17e94d5c

流程
1.实例化浏览器对象
2.分析数据  html(str) 文本格式类型   re   xpath重点
3.获取完每一页的所有书籍数据   需要进行页面滚动 完成ajax请求数据操作   加载数据
4.获取字段 1书名 2价格 3门店名字   获取数据 保存数据
5.以及需要翻页获取   方式1.更改网页url  方式2.定位下一页的element对象点击  循环第一页的爬取清洗数据的业务逻辑

作业注意点1
RESULTS (66) 60本书返回了 66条数据  因为 xpath语法的text属性 提取的是该节点下的所有文本

作业注意点2   重点 重点
RESULTS (10)  60本书返回了10个门店信息   根据反馈信息查看其他不存在门店信息的节点位置重新写入xpath语法
如果在通过xpath语法在进行匹配的时候 其中一个xpath语法不能匹配数据 就用另外一个xpath语法进行提取

列表取值注意点
在有可能会出现 返回空列表的情况下 不要进行索引取值  要在100%肯定不会是空列表的情况下 再索引取值
"""
# 1.实例化浏览器对象
import json
import time
from lxml import etree
from selenium import webdriver
from selenium.webdriver.common.by import By


# def selenium_w():
#     global driver
#     # 去除正在被自动化测试工具操作
#     options = webdriver.ChromeOptions()
#     options.add_experimental_option('excludeSwitches', ['enable-automation'])
#     options.add_argument('--incognito')
#     driver = webdriver.Chrome(executable_path=r'D:\六星教育\2203期\2022_3_python\15.selenium点选操作\chromedriver.exe',options=options)
#     # 向有图书关键字对应网页的url发送请求
#     driver.get(
#         "https://search.jd.com/Search?keyword=%E5%9B%BE%E4%B9%A6&enc=utf-8&pvid=de63a8e8d06c44d4a477ae5b17e94d5c")
#     driver.maximize_window()
# def huadongget():
#     # 只能滑动一点 因此使用循环进行 滑动
#     for i in range(10):
#         js = "window.scrollBy(0,600)"
#         driver.execute_script(js)
#         time.sleep(1)
#     #     返回网页源代码的操作
#     data = driver.page_source
#     clear_data(data)
# # 定义清洗数据的函数
# def clear_data(data):
#     # 分析数据html(str)文本格式类型 转换为可通过xpath提取数据的对象
#     html = etree.HTML(data)
#     #   1书名
#     #   2价格
#     #   3门店名字
#     #     找到包含60本书的共同节点
#     nodes = html.xpath('//ul[@class="gl-warp clearfix"]/li')
#     #     遍历共同节点
#     for node in nodes:
#         #       1书名
#         name = node.xpath('./div/div[3]/a/em/text()[1]')
#         #       2价格
#         price = node.xpath('./div/div/strong/i/text()')
#         #       3门店名字
#         #       10个门店数据的xpath语法
#
#         #         剩下50个门店数据的xpath语法  重
#         item = {"name": name[0],
#                 "price": price[0],
#               }
#         save_data(item)
# def save_data(item):
#     # dict转str操作
#     str_data = json.dumps(item, ensure_ascii=False)
#     with open("京东数据3.json", "a", encoding="utf-8")as file1:
#         file1.write(str_data + ",\n")
# def run():
#     # 翻页操作
#     # 方式2.定位下一页的element对象点击
#     num = 2
#     selenium_w()
#     #     进行第二页 的元素定位 返回element对象  点击    关于元素对象的方法
#     for i in range(num):
#         # 包含了数据清洗  数据保存
#         huadongget()
#         # 可以给出第一页不用翻的判断
#         driver.find_element(By.CLASS_NAME, 'pn-next').click()
#         time.sleep(3)
#     driver.close()
#     driver.quit()
# if __name__ == '__main__':
#     run()


def selenium_w(i):
    # 去除正在被自动化测试工具操作
    options = webdriver.ChromeOptions()
    options.add_experimental_option('excludeSwitches', ['enable-automation'])
    options.add_argument('--incognito')
    driver=webdriver.Chrome(executable_path=r'D:\六星教育\2203期\2022_3_python\15.selenium点选操作\chromedriver.exe',options=options)
    # 向有图书关键字对应网页的url发送请求
    driver.get(f"https://search.jd.com/Search?keyword=%E5%9B%BE%E4%B9%A6&pvid=de63a8e8d06c44d4a477ae5b17e94d5c&page={i*2+1}")
    driver.maximize_window()
    time.sleep(30)
    # 只能滑动一点 因此使用循环进行 滑动
    for i in range(10):
        js="window.scrollBy(0,600)"
        driver.execute_script(js)
        time.sleep(1)
#     返回网页源代码的操作
    data=driver.page_source
    driver.close()
    driver.quit()
    clear_data(data)
# 定义清洗数据的函数
def clear_data(data):
    # 分析数据html(str)文本格式类型 转换为可通过xpath提取数据的对象
    html=etree.HTML(data)
#   1书名
#   2价格
#   3门店名字
#     找到包含60本书的共同节点
    nodes=html.xpath('//ul[@class="gl-warp clearfix"]/li')
#     遍历共同节点
    for node in nodes:
#       1书名
        name=node.xpath('./div/div[3]/a/em/text()[1]')
#       2价格
        price=node.xpath('./div/div/strong/i/text()')
#       3门店名字
#       10个门店数据的xpath语法
        shop=node.xpath('./div/div[5]/a/text()')
#         剩下50个门店数据的xpath语法  重点
        if shop==[]:
            shop=node.xpath('./div/div[6]/a/text()')
        contentnum=node.xpath('/div/div[4]/strong/a/text()')
        if contentnum==[]:
            contentnum=node.xpath('./div/div[5]/strong/a/text()')
        item={"name":name[0],
              "price":price[0],
              "shop":shop[0],
              "contentnum":contentnum[0]}
        save_data(item)
def save_data(item):
    # dict转str操作
    str_data=json.dumps(item,ensure_ascii=False)
    with open("京东数据3.json","a",encoding="utf-8")as file1:
        file1.write(str_data+",\n")
def run():
    num=int(input("请输入yesh:"))
    for i in range(1,num+1):
        selenium_w(i)

if __name__ == '__main__':
    run()

